/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.knolle.validadores;

import javax.swing.JComponent;
import javax.swing.JTextField;
import org.knolle.validadores.MatcherClass.TIPOS_VALIDACION;

/**
 *
 * @author marcelo
 * La idea de esta clase es la de poder validar campos de los formularios y mostrar una ventana modal a modo de popup con al informacion sobre la 
 * falla de la validacion, con los colores y los iconos acordes a las necesidades de la validacion
 * tambien tendra los mensajes estandares de la falla y cambiara el fondo y los contornos de los componentes
 * tendra un key listener para volver esconder la ventana popup y volver los colores originales del componente afectado por la validacion
 * 
 */
public class ValidadorNumeros extends AbstractValidador{
    
    
    private Boolean requerido;
    private TIPOS_VALIDACION tipoValidacion;
    private MatcherClass matcher;
    
    
    private static final String CAMPO_TEXTO =  "^(\\S)(.){1,75}(\\S)$"; 
    private static final String CAMPO_ENTERO_POSITIVO = "(\\d){1,9}";
    private static final String CAMPO_ENTEROS = "(-)?" + CAMPO_ENTERO_POSITIVO;
    private static final String CAMPO_DECIMALES_POSITIVO =  "(\\d){1,10}(\\.(\\d){1,10})?";
    private static final String CAMPO_DECIMALES = "(-)?" + CAMPO_DECIMALES_POSITIVO;

    private static final String CAMPO_DINERO_POSITIVO =  "(\\d){1,15}(\\.(\\d){2})?";
    private static final String CAMPO_DINERO =  "(-)?" + CAMPO_DINERO_POSITIVO;
    
    private static final String MENSAJES_ERROR_CAMPO_VACIO = "Error: el campo esta vacio";
    private static final String MENSAJES_ERROR_CAMPO_NEGATIVO = "Error: el valor es negativo";
    private static final String MENSAJES_ERROR_CAMPO_NO_NUMERICO = "Error: el dato no es un numero";
    
    public ValidadorNumeros(java.awt.Frame parent, JComponent componente, String mensajeError, Boolean requerido ){
        super(parent,componente,mensajeError);
        this.requerido = requerido != null? requerido:false;
        this.tipoValidacion = TIPOS_VALIDACION.CAMPO_DECIMALES;
    }
    
    public ValidadorNumeros(javax.swing.JPanel parent, JComponent componente, String mensajeError, Boolean requerido ){
        super(parent,componente,mensajeError);
        this.requerido = requerido != null? requerido:false;
        this.tipoValidacion = TIPOS_VALIDACION.CAMPO_DECIMALES;
    }
    //MEter el tipo de validacion requerida para los numeros
    public ValidadorNumeros(javax.swing.JPanel parent, JComponent componente, String mensajeError, Boolean requerido, TIPOS_VALIDACION tipoValidacion ){
        super(parent,componente,mensajeError);
        this.requerido = requerido != null? requerido:false;
        this.tipoValidacion = tipoValidacion;
    }
    
    @Override
    protected Boolean CriterioValidacion(JComponent componente) {
        //Veremos que hacemos
        //Obtener el texto, convertir a BIG Decimal, verificar si es mayor a cero
        // Si no es numerico, Error no es un numero
        //Si no es positivo, Error debe ser mayor a cero, fin
        if(requerido && ((JTextField) componente).getText().equals("")){
            //El campo es requerido y esta vacio
            setMensaje(MENSAJES_ERROR_CAMPO_VACIO);
            return false;
        }
        //Validar numeros
        if (componente instanceof JTextField){
           String valor = ((JTextField) componente).getText();
           matcher = new MatcherClass(tipoValidacion, valor);
           
           if (!matcher.match()) {
               setMensaje(matcher.getMensaje());
               return false;
           }
           
           
           
//           switch (tipoValidacion) {
//           
//               case CAMPO_DECIMALES:
//                   if (!valor.matches(CAMPO_DECIMALES)){
//                        setMensaje(MENSAJES_ERROR_CAMPO_NO_NUMERICO);
//                        return false;
//                   }
//                   break;
//               case CAMPO_DECIMALES_POSITIVO:
//                   if (valor.matches(CAMPO_DECIMALES)){
//                        if (!valor.matches(CAMPO_DECIMALES_POSITIVO)) { 
//                            setMensaje(MENSAJES_ERROR_CAMPO_NEGATIVO);
//                            return false;
//                        }   
//                   }
//                   else {
//                       setMensaje(MENSAJES_ERROR_CAMPO_NO_NUMERICO);
//                        return false;
//                   }
//                   break;
//               case CAMPO_DINERO:
//                   if (!valor.matches(CAMPO_DINERO)){
//                        setMensaje(MENSAJES_ERROR_CAMPO_NO_NUMERICO);
//                        return false;
//                   }
//                   break;
//               case CAMPO_DINERO_POSITIVO:
//                   if (!valor.matches(CAMPO_DINERO_POSITIVO)){
//                        setMensaje(MENSAJES_ERROR_CAMPO_NEGATIVO);
//                        return false;
//                   }
//                   break;
//               case CAMPO_ENTEROS: 
//                   if (!valor.matches(CAMPO_ENTEROS)){
//                        setMensaje(MENSAJES_ERROR_CAMPO_NO_NUMERICO);
//                        return false;
//                   }
//                   break;
//               case CAMPO_ENTERO_POSITIVO:
//                   if (!valor.matches(CAMPO_ENTERO_POSITIVO)){
//                        setMensaje(MENSAJES_ERROR_CAMPO_NEGATIVO);
//                        return false;
//                   }
//                   break;    
//            }
        }
        return true;
//        
    }
        
    
}
